package image_ser

import (
	"fmt"
	"giv-vue-blog/global"
	"giv-vue-blog/models"
	"giv-vue-blog/models/ctype"
	"giv-vue-blog/plugins/qiniu"
	"giv-vue-blog/utils"
	"io"
	"mime/multipart"
	"path"
	"strings"
)

var (
	// WhiteImageList 图片上传的白名单
	WhiteImageList = []string{
		"jpg",
		"png",
		"jpeg",
		"tiff",
		"gif",
		"jfif",
		"tif",
		"ico",
		"webp",
		"fax",
		"net",
		"jpe",
		"rp",
	}
)

type FileUploadResponse struct {
	FileName  string `json:"file_name"`  //文件名
	Msg       string `json:"msg"`        //消息
	IsSuccess bool   `json:"is_success"` //是否上传成功
}

// ImageUploadService 处理文件上传的方法
func (ImageService) ImageUploadService(file *multipart.FileHeader) (res FileUploadResponse) {
	fileName := file.Filename
	//判断路径是否存在 不存在则创建
	basePath := global.Config.Upload.Path
	filePath := path.Join(basePath, file.Filename)
	res.FileName = filePath
	//文件白名单判断
	nameList := strings.Split(fileName, ".")             //[config yaml]
	suffix := strings.ToLower(nameList[len(nameList)-1]) //yaml
	//如果图片后缀不符合白名单 则返回非法图片
	if !utils.InList(suffix, WhiteImageList) {
		res.Msg = "非法文件"
		return
	}
	//如果图片符合白名单 则进行下一步操作 判断文件大小
	//判断大小 如果大小符合配置文件中设定的大小 则进行上传文件
	size := float64(file.Size) / float64(1024*1024)
	if size >= float64(global.Config.Upload.Size) {
		res.Msg = fmt.Sprintf("图片大小超过设定大小,当前大小为: %.2fMB,设定大小为: %dMB ", size, global.Config.Upload.Size)
		return
	}

	//图片后缀和图片大小判定成功后，打开一个文件对象 读取文件内容、hash
	fileObj, err := file.Open()
	if err != nil {
		global.Log.Error(err)
		return
	}
	//读取这个文件
	byteData, err := io.ReadAll(fileObj)
	//调用图片md5加密
	imgHash := utils.Md5(byteData)
	//先去数据库表中查看这个图片的hash值是否存在 如果不存在，则执行上传文件和文件入库操作
	var Banner models.BannerModel
	err = global.DB.Take(&Banner, "hash=?", imgHash).Error
	if err == nil {
		//	根据imgHash找到了对应的图片
		res.Msg = "图片已存在"
		res.FileName = Banner.Path
		return
	}
	//如果数据库中没有找到对应的图片hash 则进行图片上传 ，且七牛云配置关闭时，则直接入库
	fileType := ctype.Local
	res.Msg = "图片上传成功"
	res.IsSuccess = true
	//上传图片至七牛云 前提是七牛云配置是打开的
	if global.Config.QiNiu.Enable {
		filePath, err = qiniu.UploadImage(byteData, fileName, global.Config.QiNiu.Prefix)
		if err != nil {
			global.Log.Error(err)
			res.Msg = err.Error()
			return
		}
		res.FileName = filePath
		res.Msg = "上传七牛云成功"
		fileType = ctype.QiNiu
	}
	//将图片写到数据库中
	global.DB.Create(&models.BannerModel{
		Path:      filePath,
		Hash:      imgHash,
		Name:      fileName,
		ImageType: fileType,
	})
	return
}
